package netty.http;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static io.netty.handler.codec.http.HttpHeaderNames.*;
import static io.netty.handler.codec.http.HttpResponseStatus.CONTINUE;
import static io.netty.handler.codec.http.HttpResponseStatus.OK;
import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;

/**
 * @Author zhangtao
 * @create 2021/12/28 11:41
 */
@Slf4j
public class ResponseHandler extends ChannelHandlerAdapter {

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        ctx.flush();
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        if (msg instanceof HttpRequest) {
            HttpRequest req = (HttpRequest) msg;

            if (HttpHeaderUtil.is100ContinueExpected(req)) {
                ctx.write(new DefaultFullHttpResponse(HTTP_1_1, CONTINUE));
            }


            boolean keepAlive = HttpHeaderUtil.isKeepAlive(req);
            FullHttpResponse response = route(req);
            if (!keepAlive) {
                ctx.write(response).addListener(ChannelFutureListener.CLOSE);
            } else {
                response.headers().set(CONNECTION, HttpHeaderValues.KEEP_ALIVE);
                ctx.write(response);
            }
        }
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.printStackTrace();
        ctx.close();
    }

    public FullHttpResponse route(HttpRequest request) {
        String url;
        Map parameterMap = new HashMap<String, List<String>>();
        if (request.uri().indexOf('?') != -1) {
            url = request.uri().substring(0, request.uri().indexOf('?'));
            QueryStringDecoder decoder = new QueryStringDecoder(request.uri());
            parameterMap = decoder.parameters();
        } else {
            url = request.uri();
        }
        String output = "";
        log.info("url:{}", url);
        switch (url) {
            case "/Store/services/ws/epqc/EpqcUpdateInvByIOTWSApi/updateInvAmountByIOT":
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                output = "{\"code\":0,\"message\":\"获取IOT入库信息成功\"}";
                break;
            case "/Store/services/ws/epqc/EpqcFryerAndOvenWSApi/getEpqcFryerAndOven":
                output = "{\"code\":0,\"message\":\"[{\\\"usualUnitCode\\\":\\\"E4\\\",\\\"materialName\\\":\\\"加大版油条\\\",\\\"usualUnitName\\\":\\\"根\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"85_5_D_9\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"炸制藤椒鸡小胸\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"1552_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"EA\\\",\\\"materialName\\\":\\\"鸡蛋\\\",\\\"usualUnitName\\\":\\\"个\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"26_4_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"120克牛肉饼\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"1397_4_D_D\\\"},{\\\"usualUnitCode\\\":\\\"GM\\\",\\\"materialName\\\":\\\"油条片\\\",\\\"usualUnitName\\\":\\\"克\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"42_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"厚蛋烧\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"1426_4_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"香辣鸡腿肉\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"8_5_D_1\\\"},{\\\"usualUnitCode\\\":\\\"EA\\\",\\\"materialName\\\":\\\"新可颂\\\",\\\"usualUnitName\\\":\\\"个\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"1356_4_D_D\\\"},{\\\"usualUnitCode\\\":\\\"BC\\\",\\\"materialName\\\":\\\"冬菇滑鸡包\\\",\\\"usualUnitName\\\":\\\"袋\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"702_4_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"猪肉饼\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"27_4_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"香辣鸡翅\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"61_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"香辣风味烤腿肉\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"5_4_D_49\\\"},{\\\"usualUnitCode\\\":\\\"BC\\\",\\\"materialName\\\":\\\"小酥肉\\\",\\\"usualUnitName\\\":\\\"袋\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"1681_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"EA\\\",\\\"materialName\\\":\\\"法风烧饼\\\",\\\"usualUnitName\\\":\\\"个\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"92_4_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"鸡肉饼\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"738_4_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"香辣鸡翅边肉\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"1105_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"UNIT\\\",\\\"materialName\\\":\\\"植培黄金鸡块\\\",\\\"usualUnitName\\\":\\\"份\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"1416_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"EA\\\",\\\"materialName\\\":\\\"烤制后脆皮大鸡腿\\\",\\\"usualUnitName\\\":\\\"个\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"1243_4_D_D\\\"},{\\\"usualUnitCode\\\":\\\"HEAD\\\",\\\"materialName\\\":\\\"原味鸡\\\",\\\"usualUnitName\\\":\\\"头\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"60_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"腿肉条\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"33_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"鱼排\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"1540_5_D_18\\\"},{\\\"usualUnitCode\\\":\\\"BC\\\",\\\"materialName\\\":\\\"熏鸡肉切片\\\",\\\"usualUnitName\\\":\\\"袋\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"93_4_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"新奥尔良烤翅\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"64_4_D_1\\\"},{\\\"usualUnitCode\\\":\\\"E9\\\",\\\"materialName\\\":\\\"蛋挞（安佳）\\\",\\\"usualUnitName\\\":\\\"只\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"a709cc69-be14-4b0a-bcba-a9fe8340f2d4_4_D_D\\\"},{\\\"usualUnitCode\\\":\\\"UNIT\\\",\\\"materialName\\\":\\\"黄金鸡块\\\",\\\"usualUnitName\\\":\\\"份\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"66_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PB\\\",\\\"materialName\\\":\\\"白粥\\\",\\\"usualUnitName\\\":\\\"批\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"48_12_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"鸡胸排\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"1241_4_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"香脆薯饼\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"728_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"薄脆面片\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"992_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"EA\\\",\\\"materialName\\\":\\\"脆皮大鸡腿\\\",\\\"usualUnitName\\\":\\\"个\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"1243_5_D_18\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"玉米饼\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"752_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"劲脆鸡腿肉\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"8_5_D_2\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"新奥尔良烤腿肉\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"5_4_D_1\\\"},{\\\"usualUnitCode\\\":\\\"EA\\\",\\\"materialName\\\":\\\"华夫（原味）\\\",\\\"usualUnitName\\\":\\\"个\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"871_4_D_D\\\"},{\\\"usualUnitCode\\\":\\\"F/F(M)\\\",\\\"materialName\\\":\\\"裹粉薯条\\\",\\\"usualUnitName\\\":\\\"中薯包\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"451_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PB\\\",\\\"materialName\\\":\\\"糯米\\\",\\\"usualUnitName\\\":\\\"批\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"724_3_D_D\\\"},{\\\"usualUnitCode\\\":\\\"EA\\\",\\\"materialName\\\":\\\"红豆派\\\",\\\"usualUnitName\\\":\\\"个\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"86_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"E7\\\",\\\"materialName\\\":\\\"避风塘风味脆皮鸡腿\\\",\\\"usualUnitName\\\":\\\"块\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"1479_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"EA\\\",\\\"materialName\\\":\\\"茶叶蛋\\\",\\\"usualUnitName\\\":\\\"个\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"1386_4_D_D\\\"},{\\\"usualUnitCode\\\":\\\"F/F(M)\\\",\\\"materialName\\\":\\\"波纹薯条\\\",\\\"usualUnitName\\\":\\\"中薯包\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"428_5_D_D\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"单裹粉翅边肉\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"1\\\",\\\"materialCode\\\":\\\"1105_5_D_46\\\"},{\\\"usualUnitCode\\\":\\\"PC\\\",\\\"materialName\\\":\\\"培根片\\\",\\\"usualUnitName\\\":\\\"片\\\",\\\"planTempletName\\\":\\\"2\\\",\\\"materialCode\\\":\\\"9_4_D_D\\\"}]\"}";
                break;
            case "/dispatcher/api/v1/edge/login":
                output = "{\"data\":{\"server_push\":\"http:127.0.0.1\"}}";
                break;
            case "/dev/thirdparty/api/devices/hand-auto":
                output = "{\"data\":{\"autp\":1}}";
                break;
            case "//datak/thirdparty/api/v1/programs":
                try {
                    output = FileUtils.readFileToString(new File("D:\\spring-demo\\tool-example\\src\\main\\java\\netty\\http\\fry_programs.json"),
                            Charset.defaultCharset());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            case "//datak/thirdparty/api/v1/conf":
                try {
                    output = FileUtils.readFileToString(new File("D:\\spring-demo\\tool-example\\src\\main\\java\\netty\\http\\fry_conf.json"),
                            Charset.defaultCharset());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            case "/dev/thirdparty/api/devices/list":
                try {
                    output = FileUtils.readFileToString(new File("D:\\spring-demo\\tool-example\\src\\main\\java\\netty\\http\\device_data.json"),
                            Charset.defaultCharset());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            default:
                output = "{\"code\":1,\"message\":\"异常\"}";
                break;
        }
        FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(output.getBytes()));
        response.headers().set(CONTENT_TYPE, "application/json;charset=UTF-8");
        response.headers().setInt(CONTENT_LENGTH, response.content().readableBytes());
        return response;
    }

}
